@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ========================================
:: Windows端SSH免密登录配置脚本
:: ========================================

color 0A
cls
echo.
echo ========================================
echo    Windows端SSH免密登录配置向导
echo ========================================
echo.

:: 获取服务器信息
set /p SERVER_IP="请输入服务器IP（例如：192.168.254.131）: "
set /p SERVER_USER="请输入用户名（例如：rskg）: "
set /p SERVER_PASS="请输入密码（例如：rskg123456）: "
set /p HOST_NAME="请输入主机别名（例如：ubuntu-131）: "

echo.
echo 配置信息确认：
echo   服务器IP：%SERVER_IP%
echo   用户名：%SERVER_USER%
echo   主机别名：%HOST_NAME%
echo.
set /p CONFIRM="确认以上信息？(y/n): "
if /i not "%CONFIRM%"=="y" (
    echo 配置已取消
    pause
    exit /b
)

:: 设置密钥文件名
set KEY_NAME=ubuntu_rsa_%HOST_NAME: =_%

echo.
echo ========================================
echo 步骤1/4：检查SSH目录
echo ========================================
echo.

if not exist "%USERPROFILE%\.ssh" (
    echo 创建.ssh目录...
    mkdir "%USERPROFILE%\.ssh"
    echo ✓ .ssh目录已创建
) else (
    echo ✓ .ssh目录已存在
)

echo.
echo ========================================
echo 步骤2/4：生成SSH密钥
echo ========================================
echo.

set KEY_PATH=%USERPROFILE%\.ssh\%KEY_NAME%

if exist "%KEY_PATH%" (
    echo 警告：密钥文件已存在：%KEY_PATH%
    set /p OVERWRITE="是否覆盖？(y/n): "
    if /i not "!OVERWRITE!"=="y" (
        echo 使用现有密钥
        goto :copy_key
    )
    echo 删除旧密钥...
    del /q "%KEY_PATH%" "%KEY_PATH%.pub" 2>nul
)

echo 正在生成新密钥（RSA 4096位）...
ssh-keygen -t rsa -b 4096 -f "%KEY_PATH%" -N "" -C "%SERVER_USER%@%SERVER_IP%"

if errorlevel 1 (
    echo.
    echo ✗ 密钥生成失败！
    echo 请检查ssh-keygen命令是否可用
    pause
    exit /b 1
)

echo ✓ 密钥生成成功
echo   私钥：%KEY_PATH%
echo   公钥：%KEY_PATH%.pub

:copy_key
echo.
echo ========================================
echo 步骤3/4：复制公钥到服务器
echo ========================================
echo.
echo 测试服务器连通性...
ping -n 2 %SERVER_IP% >nul 2>&1
if errorlevel 1 (
    echo ✗ 无法连接到服务器！
    echo 请检查：
    echo   1. 服务器是否运行
    echo   2. IP地址是否正确
    echo   3. 网络连接是否正常
    pause
    exit /b 1
)
echo ✓ 服务器在线

echo.
echo 正在复制公钥到服务器...
echo 提示输入密码时，请输入：%SERVER_PASS%
echo.

:: 读取公钥内容
for /f "delims=" %%i in ('type "%KEY_PATH%.pub"') do set PUB_KEY=%%i

:: 复制公钥到服务器
type "%KEY_PATH%.pub" | ssh %SERVER_USER%@%SERVER_IP% "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && echo '公钥已添加成功'"

if errorlevel 1 (
    echo.
    echo ✗ 公钥复制失败！
    echo 可能的原因：
    echo   1. 密码错误
    echo   2. SSH服务未运行
    echo   3. 用户名错误
    pause
    exit /b 1
)

echo ✓ 公钥已复制到服务器

echo.
echo ========================================
echo 步骤4/4：配置SSH config
echo ========================================
echo.

set CONFIG_FILE=%USERPROFILE%\.ssh\config

if not exist "%CONFIG_FILE%" (
    echo 创建新的config文件...
    type nul > "%CONFIG_FILE%"
)

:: 检查是否已存在配置
findstr /C:"Host %HOST_NAME%" "%CONFIG_FILE%" >nul 2>&1
if not errorlevel 1 (
    echo 警告：%HOST_NAME% 配置已存在
    set /p UPDATE_CONFIG="是否更新配置？(y/n): "
    if /i not "!UPDATE_CONFIG!"=="y" (
        echo 跳过config配置
        goto :test_connection
    )
    
    :: 备份现有配置
    echo 备份现有配置...
    copy /y "%CONFIG_FILE%" "%CONFIG_FILE%.bak" >nul
    
    :: 删除旧配置（简单实现：重新生成整个文件）
    echo 更新配置...
)

:: 追加新配置
echo. >> "%CONFIG_FILE%"
echo Host %HOST_NAME% >> "%CONFIG_FILE%"
echo   HostName %SERVER_IP% >> "%CONFIG_FILE%"
echo   User %SERVER_USER% >> "%CONFIG_FILE%"
echo   IdentityFile %KEY_PATH% >> "%CONFIG_FILE%"
echo. >> "%CONFIG_FILE%"

echo ✓ SSH config已配置
echo   位置：%CONFIG_FILE%

:test_connection
echo.
echo ========================================
echo 测试免密登录
echo ========================================
echo.

echo 测试连接到 %HOST_NAME%...
ssh -i "%KEY_PATH%" -o BatchMode=yes -o ConnectTimeout=5 %SERVER_USER%@%SERVER_IP% "echo '✓ 免密登录成功！' && echo '' && echo '服务器信息：' && echo '  用户：' && whoami && echo '  主机：' && hostname && echo '  路径：' && pwd"

if errorlevel 1 (
    echo.
    echo ✗ 免密登录测试失败！
    echo.
    echo 可能的原因：
    echo   1. 公钥未正确添加到服务器
    echo   2. 服务器SSH配置不允许密钥认证
    echo   3. 权限问题
    echo.
    echo 手动测试命令：
    echo   ssh -i "%KEY_PATH%" %SERVER_USER%@%SERVER_IP%
    echo.
    pause
    exit /b 1
)

echo.
echo ========================================
echo 配置完成总结
echo ========================================
echo.
echo ✓ SSH密钥已生成
echo ✓ 公钥已复制到服务器
echo ✓ SSH config已配置
echo ✓ 免密登录测试成功
echo.
echo 快速连接方法：
echo   1. 命令行：ssh %HOST_NAME%
echo   2. Cursor：Remote-SSH: Connect to Host 选择 %HOST_NAME%
echo.
echo 密钥文件位置：
echo   私钥：%KEY_PATH%
echo   公钥：%KEY_PATH%.pub
echo   配置：%CONFIG_FILE%
echo.
echo ========================================
echo       配置完成！🎉
echo ========================================
echo.

:: 询问是否创建快速连接脚本
set /p CREATE_BAT="是否创建快速连接脚本？(y/n): "
if /i "%CREATE_BAT%"=="y" (
    set BAT_FILE=login-%HOST_NAME%.bat
    echo @echo off > "!BAT_FILE!"
    echo echo ======================================== >> "!BAT_FILE!"
    echo echo   连接到 %HOST_NAME% >> "!BAT_FILE!"
    echo echo ======================================== >> "!BAT_FILE!"
    echo echo. >> "!BAT_FILE!"
    echo echo 服务器：%SERVER_IP% >> "!BAT_FILE!"
    echo echo 用户：%SERVER_USER% >> "!BAT_FILE!"
    echo echo. >> "!BAT_FILE!"
    echo ssh %HOST_NAME% >> "!BAT_FILE!"
    echo pause >> "!BAT_FILE!"
    
    echo ✓ 快速连接脚本已创建：!BAT_FILE!
    echo   双击即可快速登录！
    echo.
)

:: 询问是否测试连接
set /p TEST_NOW="是否立即测试连接？(y/n): "
if /i "%TEST_NOW%"=="y" (
    echo.
    echo 正在连接到服务器...
    echo 输入 exit 退出SSH连接
    echo.
    pause
    ssh %HOST_NAME%
)

echo.
echo 按任意键退出...
pause >nul

